package com.tedu.review.day02;

/**
 *  抽象类的特点：<补充>
 *             抽象类=类：成员变量+构造器+成员方法
 *             成员变量：既可以是变量 也可以是常量
 *             构造方法：有
 *                        用于子类访问父类的数据【父类默认初始化】
 *             成员方法：既可以是抽象的 也可以是非抽象的
 *
 *             抽象方法的特性：
 *             A：抽象方法------目的：强制子类做的事情【子类一定重写】
 *             B：非抽象方法----目的：子类继承的事情 提高代码复用性【与普通父类一样】
 *
 *
 */
abstract class Foo{
    //成员变量
    public int i=30;
    //成员变量修饰加上 final  也可以叫常量【识别常量：标识符全大写】
    public final int j=20;    //Java强类型语言 ：标识符大小写分明
    //  public int j=30；

    public Foo() {//创建对象同时一并创建：初始化---传输成员变量数据
        this(30);//this()调用本类其他构造器 调用有参数---当前属性/成员变量重新赋值
    }

    public Foo(int i) {
        this.i = i;
    }
    //成员方法：抽象  【重写】  非抽象【提高复用---继承父类】
    public abstract void show();
    public void methed(){
        System.out.println("Foo---method");
    }
}
//无法实例化【无法直接创建对象】---继承---多态性---利用造型
//Goo   子类【实现类】继承   抽象类   子类必须重写抽象类中所有的抽象方法

class Goo extends Foo{

    @Override
    public void show() {  //抽象类 抽象方法 show（）---一定重写
        System.out.println("show Goo");
    }
    public void method(){
        System.out.println("Goo method");
    }

}
public class 抽象类特点1 {
    public static void main(String[] args) {
        //创建对象---实例化
       Foo f=new Goo();
       //1.实例化--初始化Goo()构造器 类默认存在空构造器
        //2.空构造器默认存在：super（） 调用父类的无参构造器
        //3.父类无参构造器中存在：this（） 调用本类有参构造器
        //4.this（参数）给Foo抽象类的i值进行覆盖   i=30
        System.out.println(f.i);  //5.引用调取i值     打印30
        //调取抽象类常量  不可以给常量赋值
        System.out.println(f.j);

        //-------------------------------------------------------
        f.show();//抽象方法   一定被子类重写   Goo     show
        f.methed();//非抽象方法     选择实现重写    Goo   show
    }
}
